﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace INSTA.Concepts.Constructors
{

    /// <summary>
    /// Classe implémentée en tant que Singleton.
    /// La définition de la design-patern Singleton est :
    ///     "Une classe dont seule une instance peut exister,
    ///      et qui fournit un point d'accès global à cette instance."
    /// </summary>
    public class Singleton
    {
        // STEP 1 : On déclare une variable qui va contenir
        //          l'instance unique de la classe.
        private static Singleton _instance = null;

        // STEP 2 : On crée un construteur (avec ou sans paramètres),
        //          inaccessible depuis l'extérieur de la classe (private)
        private Singleton()
        {}
  
        // STEP 3 : On crée le "point d'accès global à l'instance unique"
        //          sous la forme d'une méthode statique qui renvoie cette
        //          instance unique.
        public static Singleton getInstance()
        {
            // Si c'est le 1er appel à cette méthode..
            if (_instance == null)
            {
                // On crée l'instance unique en appelant le constructeur
                // privé (depuis l'intérieur de la classe donc OK).
                _instance = new Singleton();
            }

            // et l'on fait renvoyer l'instance précédemment créée.
            return _instance;
        }

    }
}
